home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / mus / play / pt_fixed.lha / PT-DeliPlayer.s < prev   
Text File  |  1993-04-25  |  27KB  |  1,344 lines

  1.  
  2.     Incdir    "Includes:"
  3.     Include    "Misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: ProTracker player module V0.2 (20 Apr 93)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_PlayerVersion,1
  18.     dc.l    DTP_PlayerName,PName
  19.     dc.l    DTP_Creator,CName
  20.     dc.l    DTP_Check2,Check
  21.     dc.l    DTP_Interrupt,mt_music
  22.     dc.l    DTP_InitPlayer,InitPlay
  23.     dc.l    DTP_EndPlayer,EndPlay
  24.     dc.l    DTP_InitSound,InitSnd
  25.     dc.l    DTP_EndSound,EndSnd
  26.     dc.l    TAG_DONE
  27.  
  28. *-----------------------------------------------------------------------*
  29. ;
  30. ; Player/Creatorname und lokale Daten
  31.  
  32. PName    dc.b 'ProTracker',0
  33. CName    dc.b 'Lars "Zap" Hamre / Amiga Freelancers,',10
  34.     dc.b 'adapted & busywait-fixed by Delirium',0
  35.     even
  36. delibase    dc.l 0
  37.  
  38. mt_data        dc.l 0
  39. mt_size        dc.l 0
  40.  
  41. *-----------------------------------------------------------------------*
  42. ;
  43. ; Testet auf PT-Modul
  44.  
  45. Check
  46.     move.l    dtg_ChkData(a5),a0
  47.  
  48.     cmpi.l    #"M.K.",$438(a0)
  49.     bne.s    ChkFail
  50.     cmpi.b    #$7f,$3b7(a0)            ; 90% ProTracker
  51.     bne.s    ChkFail                ; (I don't know a better check !)
  52.  
  53.     moveq    #0,d0                ; Modul erkannt
  54.     bra.s    ChkDone
  55. ChkFail
  56.     moveq    #-1,d0                ; Modul nicht erkannt
  57. ChkDone
  58.     rts
  59.  
  60. *-----------------------------------------------------------------------*
  61. ;
  62. ; Init Player
  63.  
  64. InitPlay
  65.     move.l    a5,delibase            ; store DT's Base
  66.  
  67.     moveq    #0,d0
  68.     move.l    dtg_GetListData(a5),a0        ; Function
  69.     jsr    (a0)
  70.     move.l    a0,mt_data
  71.     move.l    d0,mt_size
  72.  
  73.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  74.     jsr    (a0)
  75.     rts
  76.  
  77. *-----------------------------------------------------------------------*
  78. ;
  79. ; End Player
  80.  
  81. EndPlay
  82.     move.l    dtg_AudioFree(a5),a0        ; Function
  83.     jsr    (a0)
  84.     rts
  85.  
  86. *-----------------------------------------------------------------------*
  87. ;
  88. ; Init Sound
  89.  
  90. InitSnd
  91.     bsr    mt_init
  92.     st    mt_Enable
  93.     rts
  94.  
  95. *-----------------------------------------------------------------------*
  96. ;
  97. ; End Sound
  98.  
  99. EndSnd    bsr    mt_end
  100.     sf    mt_Enable
  101.     rts
  102.  
  103. *-----------------------------------------------------------------------*
  104.  
  105. ;********************************************
  106. ;* ----- Protracker V1.1B Playroutine ----- *
  107. ;* Lars "Zap" Hamre/Amiga Freelancers 1991  *
  108. ;* Bekkeliveien 10, N-2010 STRØMMEN, Norway *
  109. ;********************************************
  110.  
  111. ; CIA Version 1:
  112. ; Call SetCIAInt to install the interrupt server. Then call mt_init
  113. ; to initialize the song. Playback starts when the mt_enable flag
  114. ; is set to a nonzero value. To end the song and turn off all voices,
  115. ; call mt_end. At last, call ResetCIAInt to remove the interrupt.
  116.  
  117. ; This playroutine is not very fast, optimized or well commented,
  118. ; but all the new commands in PT1.1 should work.
  119. ; If it's not good enough, you'll have to change it yourself.
  120. ; We'll try to write a faster routine soon...
  121.  
  122. ; Changes from V1.0C playroutine:
  123. ; - Vibrato depth changed to be compatible with Noisetracker 2.0.
  124. ;   You'll have to double all vib. depths on old PT modules.
  125. ; - Funk Repeat changed to Invert Loop.
  126. ; - Period set back earlier when stopping an effect.
  127.  
  128. ;---- Tempo ----
  129.  
  130. SetTempo
  131.     move.l    #(1773447+1789773)/2,d2
  132.     cmp.w    #32,d0
  133.     bhs.s    setemsk
  134.     moveq    #32,d0
  135. setemsk    divu    d0,d2
  136.     move.l    delibase(pc),a4
  137.     move.w    d2,dtg_Timer(a4)
  138.     move.l    dtg_SetTimer(a4),a4
  139.     jsr    (a4)
  140.     rts
  141.  
  142. ;---- Playroutine ----
  143.  
  144. n_note        EQU    0  ; W
  145. n_cmd        EQU    2  ; W
  146. n_cmdlo        EQU    3  ; B
  147. n_start        EQU    4  ; L
  148. n_length    EQU    8  ; W
  149. n_loopstart    EQU    10 ; L
  150. n_replen    EQU    14 ; W
  151. n_period    EQU    16 ; W
  152. n_finetune    EQU    18 ; B
  153. n_volume    EQU    19 ; B
  154. n_dmabit    EQU    20 ; W
  155. n_toneportdirec    EQU    22 ; B
  156. n_toneportspeed    EQU    23 ; B
  157. n_wantedperiod    EQU    24 ; W
  158. n_vibratocmd    EQU    26 ; B
  159. n_vibratopos    EQU    27 ; B
  160. n_tremolocmd    EQU    28 ; B
  161. n_tremolopos    EQU    29 ; B
  162. n_wavecontrol    EQU    30 ; B
  163. n_glissfunk    EQU    31 ; B
  164. n_sampleoffset    EQU    32 ; B
  165. n_pattpos    EQU    33 ; B
  166. n_loopcount    EQU    34 ; B
  167. n_funkoffset    EQU    35 ; B
  168. n_wavestart    EQU    36 ; L
  169. n_reallength    EQU    40 ; W
  170.  
  171. mt_init    MOVE.L    mt_data(pc),A0
  172.     MOVE.L    A0,mt_SongDataPtr
  173.     MOVE.L    A0,A1
  174.     LEA    952(A1),A1
  175.     MOVEQ    #127,D0
  176.     MOVEQ    #0,D1
  177.     MOVEQ    #0,D2
  178. mtloop    MOVE.B    (A1)+,D1
  179.     CMP.B    D2,D1
  180.     BCS.S    mtloop2
  181.     MOVE.L    D1,D2
  182. mtloop2    DBRA    D0,mtloop
  183.     ADDQ.B    #1,D2
  184.  
  185.     LEA    mt_SampleStarts(pc),A1
  186.     ASL.L    #8,D2
  187.     ASL.L    #2,D2
  188.     ADD.L    #1084,D2
  189.     ADD.L    A0,D2
  190.     MOVE.L    D2,A2
  191.     MOVE.L    mt_size(pc),A3
  192.     ADD.L    A0,A3
  193.     MOVEQ    #30,D0
  194. mtloop3    CMP.L    A3,A2
  195.     BCC.S    mtloop4
  196.     CLR.L    (A2)
  197. mtloop4    MOVE.L    A2,(A1)+
  198.     MOVEQ    #0,D1
  199.     MOVE.W    42(A0),D1
  200.     ASL.L    #1,D1
  201.     ADD.L    D1,A2
  202.     LEA    30(A0),A0
  203.     DBRA    D0,mtloop3
  204.  
  205.     MOVEQ    #125,D0
  206.     BSR    SetTempo
  207.  
  208. ;    OR.B    #2,$BFE001
  209.     MOVE.B    #6,mt_speed
  210.     CLR.B    mt_counter
  211.     CLR.B    mt_SongPos
  212.     CLR.W    mt_PatternPos
  213. mt_end    SF    mt_Enable
  214.     LEA    $DFF000,A0
  215.     CLR.W    $A8(A0)
  216.     CLR.W    $B8(A0)
  217.     CLR.W    $C8(A0)
  218.     CLR.W    $D8(A0)
  219.     MOVE.W    #$F,$DFF096
  220.     RTS
  221.  
  222. mt_music
  223.     MOVEM.L    D0-D4/A0-A6,-(SP)
  224.     TST.B    mt_Enable
  225.     BEQ    mt_exit
  226.     ADDQ.B    #1,mt_counter
  227.     MOVE.B    mt_counter(PC),D0
  228.     CMP.B    mt_speed(PC),D0
  229.     BLO.S    mt_NoNewNote
  230.     CLR.B    mt_counter
  231.     TST.B    mt_PattDelTime2
  232.     BEQ.S    mt_GetNewNote
  233.     BSR.S    mt_NoNewAllChannels
  234.     BRA    mt_dskip
  235.  
  236. mt_NoNewNote
  237.     BSR.S    mt_NoNewAllChannels
  238.     BRA    mt_NoNewPosYet
  239.  
  240. mt_NoNewAllChannels
  241.     LEA    $DFF0A0,A5
  242.     LEA    mt_chan1temp(PC),A6
  243.     BSR    mt_CheckEfx
  244.     LEA    $DFF0B0,A5
  245.     LEA    mt_chan2temp(PC),A6
  246.     BSR    mt_CheckEfx
  247.     LEA    $DFF0C0,A5
  248.     LEA    mt_chan3temp(PC),A6
  249.     BSR    mt_CheckEfx
  250.     LEA    $DFF0D0,A5
  251.     LEA    mt_chan4temp(PC),A6
  252.     BRA    mt_CheckEfx
  253.  
  254. mt_GetNewNote
  255.     MOVE.L    mt_SongDataPtr(PC),A0
  256.     LEA    12(A0),A3
  257.     LEA    952(A0),A2    ;pattpo
  258.     LEA    1084(A0),A0    ;patterndata
  259.     MOVEQ    #0,D0
  260.     MOVEQ    #0,D1
  261.     MOVE.B    mt_SongPos(PC),D0
  262.     MOVE.B    (A2,D0.W),D1
  263.     ASL.L    #8,D1
  264.     ASL.L    #2,D1
  265.     ADD.W    mt_PatternPos(PC),D1
  266.     CLR.W    mt_DMACONtemp
  267.  
  268.     LEA    $DFF0A0,A5
  269.     LEA    mt_chan1temp(PC),A6
  270.     BSR.S    mt_PlayVoice
  271.     LEA    $DFF0B0,A5
  272.     LEA    mt_chan2temp(PC),A6
  273.     BSR.S    mt_PlayVoice
  274.     LEA    $DFF0C0,A5
  275.     LEA    mt_chan3temp(PC),A6
  276.     BSR.S    mt_PlayVoice
  277.     LEA    $DFF0D0,A5
  278.     LEA    mt_chan4temp(PC),A6
  279.     BSR.S    mt_PlayVoice
  280.     BRA    mt_SetDMA
  281.  
  282. mt_PlayVoice
  283.     TST.L    (A6)
  284.     BNE.S    mt_plvskip
  285.     BSR    mt_PerNop
  286. mt_plvskip
  287.     MOVE.L    (A0,D1.L),(A6)
  288.     ADDQ.L    #4,D1
  289.     MOVEQ    #0,D2
  290.     MOVE.B    n_cmd(A6),D2
  291.     AND.B    #$F0,D2
  292.     LSR.B    #4,D2
  293.     MOVE.B    (A6),D0
  294.     AND.B    #$F0,D0
  295.     OR.B    D0,D2
  296.     TST.B    D2
  297.     BEQ    mt_SetRegs
  298.     MOVEQ    #0,D3
  299.     LEA    mt_SampleStarts(PC),A1
  300.     MOVE    D2,D4
  301.     SUBQ.L    #1,D2
  302.     ASL.L    #2,D2
  303.     MULU    #30,D4
  304.     MOVE.L    (A1,D2.L),n_start(A6)
  305.     MOVE.W    (A3,D4.L),n_length(A6)
  306.     MOVE.W    (A3,D4.L),n_reallength(A6)
  307.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  308.     MOVE.B    3(A3,D4.L),n_volume(A6)
  309.     MOVE.W    4(A3,D4.L),D3 ; Get repeat
  310.     TST.W    D3
  311.     BEQ.S    mt_NoLoop
  312.     MOVE.L    n_start(A6),D2    ; Get start
  313.     ASL.W    #1,D3
  314.     ADD.L    D3,D2        ; Add repeat
  315.     MOVE.L    D2,n_loopstart(A6)
  316.     MOVE.L    D2,n_wavestart(A6)
  317.     MOVE.W    4(A3,D4.L),D0    ; Get repeat
  318.     ADD.W    6(A3,D4.L),D0    ; Add replen
  319.     MOVE.W    D0,n_length(A6)
  320.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  321.     MOVEQ    #0,D0
  322.     MOVE.B    n_volume(A6),D0
  323.     MOVE.W    D0,8(A5)    ; Set volume
  324.     BRA.S    mt_SetRegs
  325.  
  326. mt_NoLoop
  327.     MOVE.L    n_start(A6),D2
  328.     ADD.L    D3,D2
  329.     MOVE.L    D2,n_loopstart(A6)
  330.     MOVE.L    D2,n_wavestart(A6)
  331.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  332.     MOVEQ    #0,D0
  333.     MOVE.B    n_volume(A6),D0
  334.     MOVE.W    D0,8(A5)    ; Set volume
  335. mt_SetRegs
  336.     MOVE.W    (A6),D0
  337.     AND.W    #$0FFF,D0
  338.     BEQ    mt_CheckMoreEfx    ; If no note
  339.     MOVE.W    2(A6),D0
  340.     AND.W    #$0FF0,D0
  341.     CMP.W    #$0E50,D0
  342.     BEQ.S    mt_DoSetFineTune
  343.     MOVE.B    2(A6),D0
  344.     AND.B    #$0F,D0
  345.     CMP.B    #3,D0    ; TonePortamento
  346.     BEQ.S    mt_ChkTonePorta
  347.     CMP.B    #5,D0
  348.     BEQ.S    mt_ChkTonePorta
  349.     CMP.B    #9,D0    ; Sample Offset
  350.     BNE.S    mt_SetPeriod
  351.     BSR    mt_CheckMoreEfx
  352.     BRA.S    mt_SetPeriod
  353.  
  354. mt_DoSetFineTune
  355.     BSR    mt_SetFineTune
  356.     BRA.S    mt_SetPeriod
  357.  
  358. mt_ChkTonePorta
  359.     BSR    mt_SetTonePorta
  360.     BRA    mt_CheckMoreEfx
  361.  
  362. mt_SetPeriod
  363.     MOVEM.L    D0-D1/A0-A1,-(SP)
  364.     MOVE.W    (A6),D1
  365.     AND.W    #$0FFF,D1
  366.     LEA    mt_PeriodTable(PC),A1
  367.     MOVEQ    #0,D0
  368.     MOVEQ    #35,D2
  369. mt_ftuloop
  370.     CMP.W    (A1,D0.W),D1
  371.     BHS.S    mt_ftufound
  372.     ADDQ.L    #2,D0
  373.     DBRA    D2,mt_ftuloop
  374. mt_ftufound
  375.     MOVEQ    #0,D1
  376.     MOVE.B    n_finetune(A6),D1
  377.     MULU    #36*2,D1
  378.     ADD.L    D1,A1
  379.     MOVE.W    (A1,D0.W),n_period(A6)
  380.     MOVEM.L    (SP)+,D0-D1/A0-A1
  381.  
  382.     MOVE.W    2(A6),D0
  383.     AND.W    #$0FF0,D0
  384.     CMP.W    #$0ED0,D0 ; Notedelay
  385.     BEQ    mt_CheckMoreEfx
  386.  
  387. ;    MOVE.W    n_dmabit(A6),$DFF096
  388.     BTST    #2,n_wavecontrol(A6)
  389.     BNE.S    mt_vibnoc
  390.     CLR.B    n_vibratopos(A6)
  391. mt_vibnoc
  392.     BTST    #6,n_wavecontrol(A6)
  393.     BNE.S    mt_trenoc
  394.     CLR.B    n_tremolopos(A6)
  395. mt_trenoc
  396.     MOVE.L    n_start(A6),(A5)    ; Set start
  397.     MOVE.W    n_length(A6),4(A5)    ; Set length
  398. ;    MOVE.W    n_period(A6),6(A5)    ; Set period
  399.     MOVE.W    n_dmabit(A6),D0
  400.     OR.W    D0,mt_DMACONtemp
  401.     BRA    mt_CheckMoreEfx
  402.  
  403. mt_SetDMA
  404.     MOVE.W    mt_DMACONtemp(PC),D0
  405.     BSR    mt_PlaySamples        ; this does the magic
  406.     LEA    $DFF000,A5
  407.     LEA    mt_chan1temp(PC),A6
  408.     MOVE.L    n_loopstart(A6),$A0(A5)
  409.     MOVE.W    n_replen(A6),$A4(A5)
  410.     LEA    mt_chan2temp(PC),A6
  411.     MOVE.L    n_loopstart(A6),$B0(A5)
  412.     MOVE.W    n_replen(A6),$B4(A5)
  413.     LEA    mt_chan3temp(PC),A6
  414.     MOVE.L    n_loopstart(A6),$C0(A5)
  415.     MOVE.W    n_replen(A6),$C4(A5)
  416.     LEA    mt_chan4temp(PC),A6
  417.     MOVE.L    n_loopstart(A6),$D0(A5)
  418.     MOVE.W    n_replen(A6),$D4(A5)
  419.  
  420. mt_dskip
  421.     ADD.W    #16,mt_PatternPos
  422.     MOVE.B    mt_PattDelTime,D0
  423.     BEQ.S    mt_dskc
  424.     MOVE.B    D0,mt_PattDelTime2
  425.     CLR.B    mt_PattDelTime
  426. mt_dskc    TST.B    mt_PattDelTime2
  427.     BEQ.S    mt_dska
  428.     SUBQ.B    #1,mt_PattDelTime2
  429.     BEQ.S    mt_dska
  430.     SUB.W    #16,mt_PatternPos
  431. mt_dska    TST.B    mt_PBreakFlag
  432.     BEQ.S    mt_nnpysk
  433.     SF    mt_PBreakFlag
  434.     MOVEQ    #0,D0
  435.     MOVE.B    mt_PBreakPos(PC),D0
  436.     CLR.B    mt_PBreakPos
  437.     LSL.W    #4,D0
  438.     MOVE.W    D0,mt_PatternPos
  439. mt_nnpysk
  440.     CMP.W    #1024,mt_PatternPos
  441.     BLO.S    mt_NoNewPosYet
  442. mt_NextPosition    
  443.     MOVEQ    #0,D0
  444.     MOVE.B    mt_PBreakPos(PC),D0
  445.     LSL.W    #4,D0
  446.     MOVE.W    D0,mt_PatternPos
  447.     CLR.B    mt_PBreakPos
  448.     CLR.B    mt_PosJumpFlag
  449.     ADDQ.B    #1,mt_SongPos
  450.     AND.B    #$7F,mt_SongPos
  451.     MOVE.B    mt_SongPos(PC),D1
  452.     MOVE.L    mt_SongDataPtr(PC),A0
  453.     CMP.B    950(A0),D1
  454.     BLO.S    mt_NoNewPosYet
  455.     CLR.B    mt_SongPos
  456. mt_NoNewPosYet    
  457.     TST.B    mt_PosJumpFlag
  458.     BNE.S    mt_NextPosition
  459. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  460.     RTS
  461.  
  462. ;
  463. ; busywait-fixed by Delirium Softdesign.
  464. ;
  465. ; the old routine wasted about 2*10 rasterlines, this routine needs 2-8 lines
  466. ; (depending on the module). It was tested on an A500/A3000/A4000 and seems to
  467. ; play all modules ok. BTW, using this new technique it should be no problem
  468. ; to fix the busywait-loops of almost every other replay !
  469. ;
  470. ; known bugs:
  471. ;
  472. ;  sometimes when a module starts playing and the first note is played on
  473. ;  a channel, the routine needs ~100 rasterlines (in the mt_Wait2 loop).
  474. ;  perhaps this is a dma problem ?
  475. ;
  476. ; if you know how to fix these bugs please contact me:
  477. ; kunath@informatik.tu-muenchen.de (Peter Kunath)
  478. ;
  479.  
  480. mt_PlaySamples
  481.     movem.l    d0-d2/a5-a6,-(sp)
  482.     lea    $DFF000,a5
  483.     move.w    d0,d2
  484.  
  485.     move.b    $06(a5),d0        ; wait until end of line
  486. ;    move.w    #$0ff,$180(a5)
  487. mt_Wait1
  488.     cmp.b    $06(a5),d0        ; the wait should be enough even on
  489.     beq.s    mt_Wait1        ; an A4000 running DBLPAL screenmode
  490. mt_MaxPer0
  491.     btst    #0,d2
  492.     beq.s    mt_MaxPer1
  493.     move.w    #1,$A6(a5)        ; max. speed
  494. mt_MaxPer1
  495.     btst    #1,d2
  496.     beq.s    mt_MaxPer2
  497.     move.w    #1,$B6(a5)        ; max. speed
  498. mt_MaxPer2
  499.     btst    #2,d2
  500.     beq.s    mt_MaxPer3
  501.     move.w    #1,$C6(a5)        ; max. speed
  502. mt_MaxPer3
  503.     btst    #3,d2
  504.     beq.s    mt_MaxPer4
  505.     move.w    #1,$D6(a5)        ; max. speed
  506. mt_MaxPer4
  507.     move.w    $02(a5),d0        ; get active channels
  508.     and.w    d2,d0
  509.     move.w    d0,d1
  510.     lsl.w    #7,d0
  511.     move.w    d0,$9C(a5)        ; stop channels
  512.     move.w    d1,$96(a5)
  513. ;    move.w    #$f00,$180(a5)
  514. mt_Wait2
  515.     move.w    $1E(a5),d1        ; wait until all channels are stopped
  516.     and.w    d0,d1
  517.     cmp.w    d0,d1
  518.     bne.s    mt_Wait2
  519.  
  520.     move.w    $02(a5),d0        ; get active channels
  521.     not.w    d0
  522.     and.w    d2,d0
  523.     move.w    d0,d1
  524.     lsl.w    #7,d0
  525.     move.w    d0,$9C(a5)
  526.     or.w    #$8000,d1
  527.     move.w    d1,$96(a5)        ; start channels
  528. ;    move.w    #$0f0,$180(a5)
  529. mt_Wait3
  530.     move.w    $1E(a5),d1        ; wait until all channels are running
  531.     and.w    d0,d1
  532.     cmp.w    d0,d1
  533.     bne.s    mt_Wait3
  534.     move.b    $06(a5),d0        ; wait until end of line
  535. ;    move.w    #$00f,$180(a5)
  536. mt_Wait4
  537.     cmp.b    $06(a5),d0        ; the wait should be enough even on
  538.     beq.s    mt_Wait4        ; an A4000 running DBLPAL screenmode
  539. mt_SetPer0
  540.     btst    #0,d2
  541.     beq.s    mt_SetPer1
  542.     lea    mt_chan1temp(pc),a6
  543.     move.w    n_period(a6),$A6(a5)
  544. mt_SetPer1
  545.     btst    #1,d2
  546.     beq.s    mt_SetPer2
  547.     lea    mt_chan2temp(pc),a6
  548.     move.w    n_period(a6),$B6(a5)
  549. mt_SetPer2
  550.     btst    #2,d2
  551.     beq.s    mt_SetPer3
  552.     lea    mt_chan3temp(pc),a6
  553.     move.w    n_period(a6),$C6(a5)
  554. mt_SetPer3
  555.     btst    #3,d2
  556.     beq.s    mt_SetPer4
  557.     lea    mt_chan4temp(pc),a6
  558.     move.w    n_period(a6),$D6(a5)
  559. mt_SetPer4
  560. ;    move.w    #$000,$180(a5)
  561.     movem.l    (sp)+,d0-d2/a5-a6
  562.     rts
  563.  
  564. mt_CheckEfx
  565.     BSR    mt_UpdateFunk
  566.     MOVE.W    n_cmd(A6),D0
  567.     AND.W    #$0FFF,D0
  568.     BEQ.S    mt_PerNop
  569.     MOVE.B    n_cmd(A6),D0
  570.     AND.B    #$0F,D0
  571.     BEQ.S    mt_Arpeggio
  572.     CMP.B    #1,D0
  573.     BEQ    mt_PortaUp
  574.     CMP.B    #2,D0
  575.     BEQ    mt_PortaDown
  576.     CMP.B    #3,D0
  577.     BEQ    mt_TonePortamento
  578.     CMP.B    #4,D0
  579.     BEQ    mt_Vibrato
  580.     CMP.B    #5,D0
  581.     BEQ    mt_TonePlusVolSlide
  582.     CMP.B    #6,D0
  583.     BEQ    mt_VibratoPlusVolSlide
  584.     CMP.B    #$E,D0
  585.     BEQ    mt_E_Commands
  586. SetBack    MOVE.W    n_period(A6),6(A5)
  587.     CMP.B    #7,D0
  588.     BEQ    mt_Tremolo
  589.     CMP.B    #$A,D0
  590.     BEQ    mt_VolumeSlide
  591. mt_Return
  592.     RTS
  593.  
  594. mt_PerNop
  595.     MOVE.W    n_period(A6),6(A5)
  596.     RTS
  597.  
  598. mt_Arpeggio
  599.     MOVEQ    #0,D0
  600.     MOVE.B    mt_counter(PC),D0
  601.     DIVS    #3,D0
  602.     SWAP    D0
  603.     CMP.W    #0,D0
  604.     BEQ.S    mt_Arpeggio2
  605.     CMP.W    #2,D0
  606.     BEQ.S    mt_Arpeggio1
  607.     MOVEQ    #0,D0
  608.     MOVE.B    n_cmdlo(A6),D0
  609.     LSR.B    #4,D0
  610.     BRA.S    mt_Arpeggio3
  611.  
  612. mt_Arpeggio1
  613.     MOVEQ    #0,D0
  614.     MOVE.B    n_cmdlo(A6),D0
  615.     AND.B    #15,D0
  616.     BRA.S    mt_Arpeggio3
  617.  
  618. mt_Arpeggio2
  619.     MOVE.W    n_period(A6),D2
  620.     BRA.S    mt_Arpeggio4
  621.  
  622. mt_Arpeggio3
  623.     ASL.W    #1,D0
  624.     MOVEQ    #0,D1
  625.     MOVE.B    n_finetune(A6),D1
  626.     MULU    #36*2,D1
  627.     LEA    mt_PeriodTable(PC),A0
  628.     ADD.L    D1,A0
  629.     MOVEQ    #0,D1
  630.     MOVE.W    n_period(A6),D1
  631.     MOVEQ    #35,D3
  632. mt_arploop
  633.     MOVE.W    (A0,D0.W),D2
  634.     CMP.W    (A0),D1
  635.     BHS.S    mt_Arpeggio4
  636.     ADDQ.L    #2,A0
  637.     DBRA    D3,mt_arploop
  638.     RTS
  639.  
  640. mt_Arpeggio4
  641.     MOVE.W    D2,6(A5)
  642.     RTS
  643.  
  644. mt_FinePortaUp
  645.     TST.B    mt_counter
  646.     BNE.S    mt_Return
  647.     MOVE.B    #$0F,mt_LowMask
  648. mt_PortaUp
  649.     MOVEQ    #0,D0
  650.     MOVE.B    n_cmdlo(A6),D0
  651.     AND.B    mt_LowMask(PC),D0
  652.     MOVE.B    #$FF,mt_LowMask
  653.     SUB.W    D0,n_period(A6)
  654.     MOVE.W    n_period(A6),D0
  655.     AND.W    #$0FFF,D0
  656.     CMP.W    #113,D0
  657.     BPL.S    mt_PortaUskip
  658.     AND.W    #$F000,n_period(A6)
  659.     OR.W    #113,n_period(A6)
  660. mt_PortaUskip
  661.     MOVE.W    n_period(A6),D0
  662.     AND.W    #$0FFF,D0
  663.     MOVE.W    D0,6(A5)
  664.     RTS    
  665.  
  666. mt_FinePortaDown
  667.     TST.B    mt_counter
  668.     BNE    mt_Return
  669.     MOVE.B    #$0F,mt_LowMask
  670. mt_PortaDown
  671.     CLR.W    D0
  672.     MOVE.B    n_cmdlo(A6),D0
  673.     AND.B    mt_LowMask(PC),D0
  674.     MOVE.B    #$FF,mt_LowMask
  675.     ADD.W    D0,n_period(A6)
  676.     MOVE.W    n_period(A6),D0
  677.     AND.W    #$0FFF,D0
  678.     CMP.W    #856,D0
  679.     BMI.S    mt_PortaDskip
  680.     AND.W    #$F000,n_period(A6)
  681.     OR.W    #856,n_period(A6)
  682. mt_PortaDskip
  683.     MOVE.W    n_period(A6),D0
  684.     AND.W    #$0FFF,D0
  685.     MOVE.W    D0,6(A5)
  686.     RTS
  687.  
  688. mt_SetTonePorta
  689.     MOVE.L    A0,-(SP)
  690.     MOVE.W    (A6),D2
  691.     AND.W    #$0FFF,D2
  692.     MOVEQ    #0,D0
  693.     MOVE.B    n_finetune(A6),D0
  694.     MULU    #36*2,D0
  695.     LEA    mt_PeriodTable(PC),A0
  696.     ADD.L    D0,A0
  697.     MOVEQ    #0,D0
  698. mt_StpLoop
  699.     CMP.W    (A0,D0.W),D2
  700.     BHS.S    mt_StpFound
  701.     ADDQ.W    #2,D0
  702.     CMP.W    #36*2,D0
  703.     BLO.S    mt_StpLoop
  704.     MOVEQ    #35*2,D0
  705. mt_StpFound
  706.     MOVE.B    n_finetune(A6),D2
  707.     AND.B    #8,D2
  708.     BEQ.S    mt_StpGoss
  709.     TST.W    D0
  710.     BEQ.S    mt_StpGoss
  711.     SUBQ.W    #2,D0
  712. mt_StpGoss
  713.     MOVE.W    (A0,D0.W),D2
  714.     MOVE.L    (SP)+,A0
  715.     MOVE.W    D2,n_wantedperiod(A6)
  716.     MOVE.W    n_period(A6),D0
  717.     CLR.B    n_toneportdirec(A6)
  718.     CMP.W    D0,D2
  719.     BEQ.S    mt_ClearTonePorta
  720.     BGE    mt_Return
  721.     MOVE.B    #1,n_toneportdirec(A6)
  722.     RTS
  723.  
  724. mt_ClearTonePorta
  725.     CLR.W    n_wantedperiod(A6)
  726.     RTS
  727.  
  728. mt_TonePortamento
  729.     MOVE.B    n_cmdlo(A6),D0
  730.     BEQ.S    mt_TonePortNoChange
  731.     MOVE.B    D0,n_toneportspeed(A6)
  732.     CLR.B    n_cmdlo(A6)
  733. mt_TonePortNoChange
  734.     TST.W    n_wantedperiod(A6)
  735.     BEQ    mt_Return
  736.     MOVEQ    #0,D0
  737.     MOVE.B    n_toneportspeed(A6),D0
  738.     TST.B    n_toneportdirec(A6)
  739.     BNE.S    mt_TonePortaUp
  740. mt_TonePortaDown
  741.     ADD.W    D0,n_period(A6)
  742.     MOVE.W    n_wantedperiod(A6),D0
  743.     CMP.W    n_period(A6),D0
  744.     BGT.S    mt_TonePortaSetPer
  745.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  746.     CLR.W    n_wantedperiod(A6)
  747.     BRA.S    mt_TonePortaSetPer
  748.  
  749. mt_TonePortaUp
  750.     SUB.W    D0,n_period(A6)
  751.     MOVE.W    n_wantedperiod(A6),D0
  752.     CMP.W    n_period(A6),D0
  753.     BLT.S    mt_TonePortaSetPer
  754.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  755.     CLR.W    n_wantedperiod(A6)
  756.  
  757. mt_TonePortaSetPer
  758.     MOVE.W    n_period(A6),D2
  759.     MOVE.B    n_glissfunk(A6),D0
  760.     AND.B    #$0F,D0
  761.     BEQ.S    mt_GlissSkip
  762.     MOVEQ    #0,D0
  763.     MOVE.B    n_finetune(A6),D0
  764.     MULU    #36*2,D0
  765.     LEA    mt_PeriodTable(PC),A0
  766.     ADD.L    D0,A0
  767.     MOVEQ    #0,D0
  768. mt_GlissLoop
  769.     CMP.W    (A0,D0.W),D2
  770.     BHS.S    mt_GlissFound
  771.     ADDQ.W    #2,D0
  772.     CMP.W    #36*2,D0
  773.     BLO.S    mt_GlissLoop
  774.     MOVEQ    #35*2,D0
  775. mt_GlissFound
  776.     MOVE.W    (A0,D0.W),D2
  777. mt_GlissSkip
  778.     MOVE.W    D2,6(A5) ; Set period
  779.     RTS
  780.  
  781. mt_Vibrato
  782.     MOVE.B    n_cmdlo(A6),D0
  783.     BEQ.S    mt_Vibrato2
  784.     MOVE.B    n_vibratocmd(A6),D2
  785.     AND.B    #$0F,D0
  786.     BEQ.S    mt_vibskip
  787.     AND.B    #$F0,D2
  788.     OR.B    D0,D2
  789. mt_vibskip
  790.     MOVE.B    n_cmdlo(A6),D0
  791.     AND.B    #$F0,D0
  792.     BEQ.S    mt_vibskip2
  793.     AND.B    #$0F,D2
  794.     OR.B    D0,D2
  795. mt_vibskip2
  796.     MOVE.B    D2,n_vibratocmd(A6)
  797. mt_Vibrato2
  798.     MOVE.B    n_vibratopos(A6),D0
  799.     LEA    mt_VibratoTable(PC),A4
  800.     LSR.W    #2,D0
  801.     AND.W    #$001F,D0
  802.     MOVEQ    #0,D2
  803.     MOVE.B    n_wavecontrol(A6),D2
  804.     AND.B    #$03,D2
  805.     BEQ.S    mt_vib_sine
  806.     LSL.B    #3,D0
  807.     CMP.B    #1,D2
  808.     BEQ.S    mt_vib_rampdown
  809.     MOVE.B    #255,D2
  810.     BRA.S    mt_vib_set
  811. mt_vib_rampdown
  812.     TST.B    n_vibratopos(A6)
  813.     BPL.S    mt_vib_rampdown2
  814.     MOVE.B    #255,D2
  815.     SUB.B    D0,D2
  816.     BRA.S    mt_vib_set
  817. mt_vib_rampdown2
  818.     MOVE.B    D0,D2
  819.     BRA.S    mt_vib_set
  820. mt_vib_sine
  821.     MOVE.B    (A4,D0.W),D2
  822. mt_vib_set
  823.     MOVE.B    n_vibratocmd(A6),D0
  824.     AND.W    #15,D0
  825.     MULU    D0,D2
  826.     LSR.W    #7,D2
  827.     MOVE.W    n_period(A6),D0
  828.     TST.B    n_vibratopos(A6)
  829.     BMI.S    mt_VibratoNeg
  830.     ADD.W    D2,D0
  831.     BRA.S    mt_Vibrato3
  832. mt_VibratoNeg
  833.     SUB.W    D2,D0
  834. mt_Vibrato3
  835.     MOVE.W    D0,6(A5)
  836.     MOVE.B    n_vibratocmd(A6),D0
  837.     LSR.W    #2,D0
  838.     AND.W    #$003C,D0
  839.     ADD.B    D0,n_vibratopos(A6)
  840.     RTS
  841.  
  842. mt_TonePlusVolSlide
  843.     BSR    mt_TonePortNoChange
  844.     BRA    mt_VolumeSlide
  845.  
  846. mt_VibratoPlusVolSlide
  847.     BSR.S    mt_Vibrato2
  848.     BRA    mt_VolumeSlide
  849.  
  850. mt_Tremolo
  851.     MOVE.B    n_cmdlo(A6),D0
  852.     BEQ.S    mt_Tremolo2
  853.     MOVE.B    n_tremolocmd(A6),D2
  854.     AND.B    #$0F,D0
  855.     BEQ.S    mt_treskip
  856.     AND.B    #$F0,D2
  857.     OR.B    D0,D2
  858. mt_treskip
  859.     MOVE.B    n_cmdlo(A6),D0
  860.     AND.B    #$F0,D0
  861.     BEQ.S    mt_treskip2
  862.     AND.B    #$0F,D2
  863.     OR.B    D0,D2
  864. mt_treskip2
  865.     MOVE.B    D2,n_tremolocmd(A6)
  866. mt_Tremolo2
  867.     MOVE.B    n_tremolopos(A6),D0
  868.     LEA    mt_VibratoTable(PC),A4
  869.     LSR.W    #2,D0
  870.     AND.W    #$001F,D0
  871.     MOVEQ    #0,D2
  872.     MOVE.B    n_wavecontrol(A6),D2
  873.     LSR.B    #4,D2
  874.     AND.B    #$03,D2
  875.     BEQ.S    mt_tre_sine
  876.     LSL.B    #3,D0
  877.     CMP.B    #1,D2
  878.     BEQ.S    mt_tre_rampdown
  879.     MOVE.B    #255,D2
  880.     BRA.S    mt_tre_set
  881. mt_tre_rampdown
  882.     TST.B    n_vibratopos(A6)
  883.     BPL.S    mt_tre_rampdown2
  884.     MOVE.B    #255,D2
  885.     SUB.B    D0,D2
  886.     BRA.S    mt_tre_set
  887. mt_tre_rampdown2
  888.     MOVE.B    D0,D2
  889.     BRA.S    mt_tre_set
  890. mt_tre_sine
  891.     MOVE.B    (A4,D0.W),D2
  892. mt_tre_set
  893.     MOVE.B    n_tremolocmd(A6),D0
  894.     AND.W    #15,D0
  895.     MULU    D0,D2
  896.     LSR.W    #6,D2
  897.     MOVEQ    #0,D0
  898.     MOVE.B    n_volume(A6),D0
  899.     TST.B    n_tremolopos(A6)
  900.     BMI.S    mt_TremoloNeg
  901.     ADD.W    D2,D0
  902.     BRA.S    mt_Tremolo3
  903. mt_TremoloNeg
  904.     SUB.W    D2,D0
  905. mt_Tremolo3
  906.     BPL.S    mt_TremoloSkip
  907.     CLR.W    D0
  908. mt_TremoloSkip
  909.     CMP.W    #$40,D0
  910.     BLS.S    mt_TremoloOk
  911.     MOVE.W    #$40,D0
  912. mt_TremoloOk
  913.     MOVE.W    D0,8(A5)
  914.     MOVE.B    n_tremolocmd(A6),D0
  915.     LSR.W    #2,D0
  916.     AND.W    #$003C,D0
  917.     ADD.B    D0,n_tremolopos(A6)
  918.     RTS
  919.  
  920. mt_SampleOffset
  921.     MOVEQ    #0,D0
  922.     MOVE.B    n_cmdlo(A6),D0
  923.     BEQ.S    mt_sononew
  924.     MOVE.B    D0,n_sampleoffset(A6)
  925. mt_sononew
  926.     MOVE.B    n_sampleoffset(A6),D0
  927.     LSL.W    #7,D0
  928.     CMP.W    n_length(A6),D0
  929.     BGE.S    mt_sofskip
  930.     SUB.W    D0,n_length(A6)
  931.     LSL.W    #1,D0
  932.     ADD.L    D0,n_start(A6)
  933.     RTS
  934. mt_sofskip
  935.     MOVE.W    #$0001,n_length(A6)
  936.     RTS
  937.  
  938. mt_VolumeSlide
  939.     MOVEQ    #0,D0
  940.     MOVE.B    n_cmdlo(A6),D0
  941.     LSR.B    #4,D0
  942.     TST.B    D0
  943.     BEQ.S    mt_VolSlideDown
  944. mt_VolSlideUp
  945.     ADD.B    D0,n_volume(A6)
  946.     CMP.B    #$40,n_volume(A6)
  947.     BMI.S    mt_vsuskip
  948.     MOVE.B    #$40,n_volume(A6)
  949. mt_vsuskip
  950.     MOVE.B    n_volume(A6),D0
  951.     MOVE.W    D0,8(A5)
  952.     RTS
  953.  
  954. mt_VolSlideDown
  955.     MOVEQ    #0,D0
  956.     MOVE.B    n_cmdlo(A6),D0
  957.     AND.B    #$0F,D0
  958. mt_VolSlideDown2
  959.     SUB.B    D0,n_volume(A6)
  960.     BPL.S    mt_vsdskip
  961.     CLR.B    n_volume(A6)
  962. mt_vsdskip
  963.     MOVE.B    n_volume(A6),D0
  964.     MOVE.W    D0,8(A5)
  965.     RTS
  966.  
  967. mt_PositionJump
  968.     MOVE.B    n_cmdlo(A6),D0
  969.     SUBQ.B    #1,D0
  970.     MOVE.B    D0,mt_SongPos
  971. mt_pj2    CLR.B    mt_PBreakPos
  972.     ST     mt_PosJumpFlag
  973.     RTS
  974.  
  975. mt_VolumeChange
  976.     MOVEQ    #0,D0
  977.     MOVE.B    n_cmdlo(A6),D0
  978.     CMP.B    #$40,D0
  979.     BLS.S    mt_VolumeOk
  980.     MOVEQ    #$40,D0
  981. mt_VolumeOk
  982.     MOVE.B    D0,n_volume(A6)
  983.     MOVE.W    D0,8(A5)
  984.     RTS
  985.  
  986. mt_PatternBreak
  987.     MOVEQ    #0,D0
  988.     MOVE.B    n_cmdlo(A6),D0
  989.     MOVE.L    D0,D2
  990.     LSR.B    #4,D0
  991.     MULU    #10,D0
  992.     AND.B    #$0F,D2
  993.     ADD.B    D2,D0
  994.     CMP.B    #63,D0
  995.     BHI.S    mt_pj2
  996.     MOVE.B    D0,mt_PBreakPos
  997.     ST    mt_PosJumpFlag
  998.     RTS
  999.  
  1000. mt_SetSpeed
  1001.     MOVEQ    #0,D0
  1002.     MOVE.B    3(A6),D0
  1003.     BEQ    mt_end
  1004.     CMP.B    #32,D0
  1005.     BHS    SetTempo
  1006.     CLR.B    mt_counter
  1007.     MOVE.B    D0,mt_speed
  1008.     RTS
  1009.  
  1010. mt_CheckMoreEfx
  1011.     BSR    mt_UpdateFunk
  1012.     MOVE.B    2(A6),D0
  1013.     AND.B    #$0F,D0
  1014.     CMP.B    #$9,D0
  1015.     BEQ    mt_SampleOffset
  1016.     CMP.B    #$B,D0
  1017.     BEQ    mt_PositionJump
  1018.     CMP.B    #$D,D0
  1019.     BEQ.S    mt_PatternBreak
  1020.     CMP.B    #$E,D0
  1021.     BEQ.S    mt_E_Commands
  1022.     CMP.B    #$F,D0
  1023.     BEQ.S    mt_SetSpeed
  1024.     CMP.B    #$C,D0
  1025.     BEQ    mt_VolumeChange
  1026.     BRA    mt_PerNop
  1027.  
  1028. mt_E_Commands
  1029.     MOVE.B    n_cmdlo(A6),D0
  1030.     AND.B    #$F0,D0
  1031.     LSR.B    #4,D0
  1032.     BEQ.S    mt_FilterOnOff
  1033.     CMP.B    #1,D0
  1034.     BEQ    mt_FinePortaUp
  1035.     CMP.B    #2,D0
  1036.     BEQ    mt_FinePortaDown
  1037.     CMP.B    #3,D0
  1038.     BEQ.S    mt_SetGlissControl
  1039.     CMP.B    #4,D0
  1040.     BEQ    mt_SetVibratoControl
  1041.     CMP.B    #5,D0
  1042.     BEQ    mt_SetFineTune
  1043.     CMP.B    #6,D0
  1044.     BEQ    mt_JumpLoop
  1045.     CMP.B    #7,D0
  1046.     BEQ    mt_SetTremoloControl
  1047.     CMP.B    #9,D0
  1048.     BEQ    mt_RetrigNote
  1049.     CMP.B    #$A,D0
  1050.     BEQ    mt_VolumeFineUp
  1051.     CMP.B    #$B,D0
  1052.     BEQ    mt_VolumeFineDown
  1053.     CMP.B    #$C,D0
  1054.     BEQ    mt_NoteCut
  1055.     CMP.B    #$D,D0
  1056.     BEQ    mt_NoteDelay
  1057.     CMP.B    #$E,D0
  1058.     BEQ    mt_PatternDelay
  1059.     CMP.B    #$F,D0
  1060.     BEQ    mt_FunkIt
  1061.     RTS
  1062.  
  1063. mt_FilterOnOff
  1064.     MOVE.B    n_cmdlo(A6),D0
  1065.     AND.B    #1,D0
  1066.     ASL.B    #1,D0
  1067.     AND.B    #$FD,$BFE001
  1068.     OR.B    D0,$BFE001
  1069.     RTS    
  1070.  
  1071. mt_SetGlissControl
  1072.     MOVE.B    n_cmdlo(A6),D0
  1073.     AND.B    #$0F,D0
  1074.     AND.B    #$F0,n_glissfunk(A6)
  1075.     OR.B    D0,n_glissfunk(A6)
  1076.     RTS
  1077.  
  1078. mt_SetVibratoControl
  1079.     MOVE.B    n_cmdlo(A6),D0
  1080.     AND.B    #$0F,D0
  1081.     AND.B    #$F0,n_wavecontrol(A6)
  1082.     OR.B    D0,n_wavecontrol(A6)
  1083.     RTS
  1084.  
  1085. mt_SetFineTune
  1086.     MOVE.B    n_cmdlo(A6),D0
  1087.     AND.B    #$0F,D0
  1088.     MOVE.B    D0,n_finetune(A6)
  1089.     RTS
  1090.  
  1091. mt_JumpLoop
  1092.     TST.B    mt_counter
  1093.     BNE    mt_Return
  1094.     MOVE.B    n_cmdlo(A6),D0
  1095.     AND.B    #$0F,D0
  1096.     BEQ.S    mt_SetLoop
  1097.     TST.B    n_loopcount(A6)
  1098.     BEQ.S    mt_jumpcnt
  1099.     SUBQ.B    #1,n_loopcount(A6)
  1100.     BEQ    mt_Return
  1101. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1102.     ST    mt_PBreakFlag
  1103.     RTS
  1104.  
  1105. mt_jumpcnt
  1106.     MOVE.B    D0,n_loopcount(A6)
  1107.     BRA.S    mt_jmploop
  1108.  
  1109. mt_SetLoop
  1110.     MOVE.W    mt_PatternPos(PC),D0
  1111.     LSR.W    #4,D0
  1112.     MOVE.B    D0,n_pattpos(A6)
  1113.     RTS
  1114.  
  1115. mt_SetTremoloControl
  1116.     MOVE.B    n_cmdlo(A6),D0
  1117.     AND.B    #$0F,D0
  1118.     LSL.B    #4,D0
  1119.     AND.B    #$0F,n_wavecontrol(A6)
  1120.     OR.B    D0,n_wavecontrol(A6)
  1121.     RTS
  1122.  
  1123. mt_RetrigNote
  1124.     MOVE.L    D1,-(SP)
  1125.     MOVEQ    #0,D0
  1126.     MOVE.B    n_cmdlo(A6),D0
  1127.     AND.B    #$0F,D0
  1128.     BEQ.S    mt_rtnend
  1129.     MOVEQ    #0,D1
  1130.     MOVE.B    mt_counter(PC),D1
  1131.     BNE.S    mt_rtnskp
  1132.     MOVE.W    (A6),D1
  1133.     AND.W    #$0FFF,D1
  1134.     BNE.S    mt_rtnend
  1135.     MOVEQ    #0,D1
  1136.     MOVE.B    mt_counter(PC),D1
  1137. mt_rtnskp
  1138.     DIVU    D0,D1
  1139.     SWAP    D1
  1140.     TST.W    D1
  1141.     BNE.S    mt_rtnend
  1142. mt_DoRetrig
  1143. ;    MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1144.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1145.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1146.     MOVE.W    n_dmabit(A6),D0
  1147.     BSR    mt_PlaySamples        ; this does the magic
  1148.     MOVE.L    n_loopstart(A6),(A5)
  1149.     MOVE.L    n_replen(A6),4(A5)
  1150. mt_rtnend
  1151.     MOVE.L    (SP)+,D1
  1152.     RTS
  1153.  
  1154. mt_VolumeFineUp
  1155.     TST.B    mt_counter
  1156.     BNE    mt_Return
  1157.     MOVEQ    #0,D0
  1158.     MOVE.B    n_cmdlo(A6),D0
  1159.     AND.B    #$F,D0
  1160.     BRA    mt_VolSlideUp
  1161.  
  1162. mt_VolumeFineDown
  1163.     TST.B    mt_counter
  1164.     BNE    mt_Return
  1165.     MOVEQ    #0,D0
  1166.     MOVE.B    n_cmdlo(A6),D0
  1167.     AND.B    #$0F,D0
  1168.     BRA    mt_VolSlideDown2
  1169.  
  1170. mt_NoteCut
  1171.     MOVEQ    #0,D0
  1172.     MOVE.B    n_cmdlo(A6),D0
  1173.     AND.B    #$0F,D0
  1174.     CMP.B    mt_counter(PC),D0
  1175.     BNE    mt_Return
  1176.     CLR.B    n_volume(A6)
  1177.     MOVE.W    #0,8(A5)
  1178.     RTS
  1179.  
  1180. mt_NoteDelay
  1181.     MOVEQ    #0,D0
  1182.     MOVE.B    n_cmdlo(A6),D0
  1183.     AND.B    #$0F,D0
  1184.     CMP.B    mt_counter,D0
  1185.     BNE    mt_Return
  1186.     MOVE.W    (A6),D0
  1187.     BEQ    mt_Return
  1188.     MOVE.L    D1,-(SP)
  1189.     BRA    mt_DoRetrig
  1190.  
  1191. mt_PatternDelay
  1192.     TST.B    mt_counter
  1193.     BNE    mt_Return
  1194.     MOVEQ    #0,D0
  1195.     MOVE.B    n_cmdlo(A6),D0
  1196.     AND.B    #$0F,D0
  1197.     TST.B    mt_PattDelTime2
  1198.     BNE    mt_Return
  1199.     ADDQ.B    #1,D0
  1200.     MOVE.B    D0,mt_PattDelTime
  1201.     RTS
  1202.  
  1203. mt_FunkIt
  1204.     TST.B    mt_counter
  1205.     BNE    mt_Return
  1206.     MOVE.B    n_cmdlo(A6),D0
  1207.     AND.B    #$0F,D0
  1208.     LSL.B    #4,D0
  1209.     AND.B    #$0F,n_glissfunk(A6)
  1210.     OR.B    D0,n_glissfunk(A6)
  1211.     TST.B    D0
  1212.     BEQ    mt_Return
  1213. mt_UpdateFunk
  1214.     MOVEM.L    A0/D1,-(SP)
  1215.     MOVEQ    #0,D0
  1216.     MOVE.B    n_glissfunk(A6),D0
  1217.     LSR.B    #4,D0
  1218.     BEQ.S    mt_funkend
  1219.     LEA    mt_FunkTable(PC),A0
  1220.     MOVE.B    (A0,D0.W),D0
  1221.     ADD.B    D0,n_funkoffset(A6)
  1222.     BTST    #7,n_funkoffset(A6)
  1223.     BEQ.S    mt_funkend
  1224.     CLR.B    n_funkoffset(A6)
  1225.  
  1226.     MOVE.L    n_loopstart(A6),D0
  1227.     MOVEQ    #0,D1
  1228.     MOVE.W    n_replen(A6),D1
  1229.     ADD.L    D1,D0
  1230.     ADD.L    D1,D0
  1231.     MOVE.L    n_wavestart(A6),A0
  1232.     ADDQ.L    #1,A0
  1233.     CMP.L    D0,A0
  1234.     BLO.S    mt_funkok
  1235.     MOVE.L    n_loopstart(A6),A0
  1236. mt_funkok
  1237.     MOVE.L    A0,n_wavestart(A6)
  1238.     MOVEQ    #-1,D0
  1239.     SUB.B    (A0),D0
  1240.     MOVE.B    D0,(A0)
  1241. mt_funkend
  1242.     MOVEM.L    (SP)+,A0/D1
  1243.     RTS
  1244.  
  1245.  
  1246. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1247.  
  1248. mt_VibratoTable    
  1249.     dc.b 000,024,049,074,097,120,141,161
  1250.     dc.b 180,197,212,224,235,244,250,253
  1251.     dc.b 255,253,250,244,235,224,212,197
  1252.     dc.b 180,161,141,120,097,074,049,024
  1253.  
  1254. mt_PeriodTable
  1255. ; Tuning 0, Normal
  1256.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1257.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1258.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1259. ; Tuning 1
  1260.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1261.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1262.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1263. ; Tuning 2
  1264.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1265.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1266.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1267. ; Tuning 3
  1268.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1269.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1270.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1271. ; Tuning 4
  1272.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1273.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1274.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1275. ; Tuning 5
  1276.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1277.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1278.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1279. ; Tuning 6
  1280.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1281.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1282.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1283. ; Tuning 7
  1284.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1285.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1286.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1287. ; Tuning -8
  1288.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1289.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1290.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1291. ; Tuning -7
  1292.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1293.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1294.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1295. ; Tuning -6
  1296.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1297.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1298.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1299. ; Tuning -5
  1300.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1301.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1302.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1303. ; Tuning -4
  1304.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1305.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1306.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1307. ; Tuning -3
  1308.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1309.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1310.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1311. ; Tuning -2
  1312.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1313.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1314.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1315. ; Tuning -1
  1316.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1317.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1318.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1319.  
  1320. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,0,0,0,0
  1321. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,0,0,0,0
  1322. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,0,0,0,0
  1323. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,0,0,0,0
  1324.  
  1325. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1326.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1327.  
  1328. mt_SongDataPtr    dc.l 0
  1329. mt_speed    dc.b 6
  1330. mt_counter    dc.b 0
  1331. mt_SongPos    dc.b 0
  1332. mt_PBreakPos    dc.b 0
  1333. mt_PosJumpFlag    dc.b 0
  1334. mt_PBreakFlag    dc.b 0
  1335. mt_LowMask    dc.b 0
  1336. mt_PattDelTime    dc.b 0
  1337. mt_PattDelTime2    dc.b 0
  1338. mt_Enable    dc.b 0
  1339. mt_PatternPos    dc.w 0
  1340. mt_DMACONtemp    dc.w 0
  1341.  
  1342. ;/* End of File */
  1343.  
  1344.